iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0

昨天介紹完打擊,今天接下來介紹投球,不過其實大多數的參數都滿像的,但投手的 methods 多打者滿多的,一起來瞧瞧吧。

statcast_pitcher

跟昨天的 statcast_batter 是用同一個頁面的搜尋,所以參數跟回傳的欄位都會一樣。不過 官方文件 有另外提到一個 issue,是假設搜尋的範圍有超過 30000 顆球,最多也只能獲得 30000 顆球的資料。

另外我發現他假設搜不到投球資料會回傳錯誤,而不是跟 statcast_batter 一樣會回傳空的 DataFrame,所以在操作的時候可能要注意一下,如果只想取得當天投球資料要很確定日期是正確的。

  • start_dt:搜尋的開始日期,需符合 YYYY-MM-DD 的字串格式,預設會是昨天,如果只填開始日期會只有填入當天的資料。
  • end_dt:搜尋的結束日期,需符合 YYYY-MM-DD的字串格式,預設是 None,如果要找一天以上的資料一定要填結束日期。
  • player_id:球員的 mlbam ID,需為整數,為必填,沒填入數字會出現錯誤,也可以去 Savant 的球員個人頁的 URL 得知球員的 mlbam ID。例如 Kershaw 的 https://baseballsavant.mlb.com/savant-player/clayton-kershaw-477132,ID 就會是最後面那個數字,477132。

範例:

from pybaseball import statcast_pitcher

# 獲得大谷翔平(mlbam=660271)2023-03-30 到 2023-09-20 的投球數據
data = statcast_pitcher(start_dt="2023-03-31", end_dt="2023-09-20", player_id=660271)

# 獲得大谷翔平昨天的數據,因為他沒上場所以應該要是空的,但這次會回傳錯誤
# statcast_pitcher(player_id=660271)

statcast_pitcher_exitvelo_barrels

statcast_batter_exitvelo_barrels 使用同一個頁面獲得打擊初速相關資料,所以參數跟回傳欄位會一樣,不過改顯示成投手被擊出的打擊初速相關數據。另外一個不一樣的地方是最小 BBE 的計算,如果是預設 Qualified 的話會是 1.25 個打席數 * 球隊出賽數而不是 2.1 個打席數來計算。然後再補充一個我昨天的解釋錯誤,他雖然是寫 minBBE,但他 Qualified 的還是是看打席數決定,而不是 BBE。

  • year:查詢的球季,必填,需為整數。
  • minBBE:最小 Batted Ball Event (BBE),如果是預設值會是 Qualified,會看最小打席數是否超過 1.25 個打席數 * 球隊出賽數。如果是選其他選項就會把超過的 BBE 投手篩掉。例如:minBBE=100 就會篩出至少 BBE 100 以上的投手。
from pybaseball import statcast_pitcher_exitvelo_barrels

# 獲得 2023 球季投手投球被擊出的打擊初速相關數據
statcast_pitcher_exitvelo_barrels(2023)

# 獲得 2023 球季投手投球被擊出的打擊初速相關數據 並限制投手至少要達成 100 BBE
statcast_pitcher_exitvelo_barrels(2023, minBBE=100)

想再補充一個,回傳的資料會找不到 BBE 是因為他在取得資料後的欄位會叫 attempts,其他欄位其實也會跟網頁上的不一樣,但順序會一樣,可以比對一下。然後還有一個跟網頁上的不一樣的是,pybaseball 會預設先依照 BBE 排序 (由大到小),網頁預設則是 Brls/PA% (一個打席擊出 Barrel 的比例,投手會是由小排到大,打者會是由大牌到小)

Statcast Leaderboard | baseballsavant.com (mlb.com)

statcast_pitcher_expected_stats

statcast_batter_expected_stats 使用同一個頁面獲得各種預期數據,所以參數跟部分回傳欄位會一樣,不過投手會多顯示 xERA,也就是預期的投手自責分率。回傳資料會依據 pa 打席數由大到小排序,網頁裡的則是 xwOBA

https://baseballsavant.mlb.com/leaderboard/expected_statistics?type=pitcher

  • year:查詢的球季,必填,需為整數。
  • minPA:最小打席數,預設是 Qualified ,用 1.25 打席數 * 球隊出賽數計算。
from pybaseball import statcast_pitcher_expected_stats

# 獲得 2023 球季的投手被打擊預測數據 + 預期 ERA
statcast_pitcher_expected_stats(2023)

# 獲得 2023 球季的投手被打擊預測數據 + 預期 ERA,但沒有限制打席數
statcast_pitcher_expected_stats(2023, minPA=0)

statcast_pitcher_percentile_ranks

statcast_batter_percentile_ranks 使用同一個頁面獲得各項進階數據的 PR 值,所以參數跟部分回傳欄位會一樣。不一樣的地方是投手不會有守備跟跑壘 PR,取而代之的是速球球速、速球轉速與曲球轉速。

https://baseballsavant.mlb.com/leaderboard/percentile-rankings?type=pitcher

year:查詢的球季,必填,需為整數。

範例:

from pybaseball import statcast_pitcher_percentile_ranks

# 獲得 2023 球季的各項投球數據 PR 值
statcast_pitcher_percentile_ranks(2023)

statcast_pitcher_arsenal_stats

statcast_batter_pitch_arsenal 使用同一個頁面獲得投手特定球種的表現,例如 Run Value 排名第一的是巨人隊 Logan Webb 的變速球。需要注意一下跟下面接下來要介紹的 statcast_pitcher_pitch_arsenal 是不一樣的東西,請小心不要搞混了。

Statcast Pitch Arsenal Stats | baseballsavant.com (mlb.com)

  • year:查詢的球季,必填,需為整數。
  • minPA:最小打席數,預設是 25 個打席。

範例:

from pybaseball import statcast_pitcher_arsenal_stats

# 獲得 2023 球季各打者對決各種球種的數據
statcast_pitcher_arsenal_stats(2023)

# 獲得 2023 球季各打者對決各種球種的數據但沒有限制打席數
statcast_pitcher_arsenal_stats(2023, minPA=0)

statcast_pitcher_pitch_arsenal

雖然跟 statcast_batter_pitch_arsenal 只有 batterpitcher 的差別,但他們其實是不同頁面的資料。這頁主要是可以直接看到投手各球種的資料,分為平均球速球種比例平均轉速,預設會是平均球速。

Statcast Pitch Arsenals Leaderboard | baseballsavant.com (mlb.com)

  • year:查詢的球季,必填,需為整數。
  • minP:最小投球數,預設為 250 球。
  • arsenal_type:會有三個選項,分別是 avg_speed 平均球速、n_ 球種分布、avg_spin 平均轉速。預設是 avg_speed,如果填其他的會產生錯誤。

範例:

from pybaseball import statcast_pitcher_pitch_arsenal

# 獲得 2023 球季各投手的各球種數據,預設種類是平均球速
statcast_pitcher_pitch_arsenal(2023)

# 獲得 2023 球季各投手的各球種數據,限制最小投球數 1000
statcast_pitcher_pitch_arsenal(2023, minP=1000)

# 獲得 2023 球季各投手的各球種數據,種類改成各球種比例
statcast_pitcher_pitch_arsenal(2023, arsenal_type='n_')

statcast_pitcher_pitch_movement

各球種的位移資料,可以選特定球種觀看。會有 Vertical Movement 垂直位移和 Horizontal Movement 水平位移等資料。位移量單位為英呎。會用不同球種做分類,如果去他們頁面還可以看到位移分布圖:

Statcast Pitch Movement Leaderboard | baseballsavant.com (mlb.com)

  • year:查詢的球季,必填,需為整數。
  • minP:最小投球數,預設為 Qualified,為 3 * 球隊出賽數的投球數,另外投手需要投到指定球種占總投球數 5 % 才會符合資格。
  • pitch_type:想查看的球種,能查詢的球種代碼可以參考 這裡。有 FF 四縫線、SIFT 伸卡球、CH 變速球、CUKC 曲球、SL 滑球、FS 快速指叉球、ALL 全球種等。預設是 FF。2023 新增的 ST Sweeper 也在裡面。

範例:

from pybaseball.statcast_pitcher import statcast_pitcher_pitch_movement

# 獲得 2023 球季各球種的位移數據
statcast_pitcher_pitch_movement(2023)

# 獲得 2023 球季各球種的位移數據,限制最小投球數 1000
statcast_pitcher_pitch_movement(2023, minP=1000)

# 獲得 2023 球季各球種的位移數據,種類改成滑球,預設會是四縫線 FF
statcast_pitcher_pitch_movement(2023, pitch_type="SL")

這邊要注意一下 import 要寫 pybaseball.statcast_pitcher,因為在 init 檔案裏面沒有 import,然後 官方文件 有錯誤,在這個 Issue 有提到:statcast_pitcher_pitch_movement & statcast_pitcher_active_spin not importing · Issue #382 · jldbc/pybaseball (github.com)

statcast_pitcher_active_spin

獲得投球 Active Spin (有效旋轉) 相關的資料,簡單的來說產生的旋轉有轉換成球的位移,那就可以稱為有效旋轉。Statcast 使用兩種方法來獲得有效旋轉資料,也可以在這個頁面去選擇不同方法而獲得不同結果,不過目前 pybaseball 只提供 Spin Based 方法。

https://baseballsavant.mlb.com/leaderboard/active-spin

  • year:查詢的球季,必填,需為整數。
  • minP:最小投球數,預設為 250 球。
  • _type:計算方法,雖然這在 官方文件 沒有提到,但其實可以為 spin-basedobserved,如果輸入別的會找不到資料,預設為 spin-based。另外要注意,2020 之前還沒有 spin-based 方法,所以假設選取 2020 之前且沒有填入這個參數,會自動變成 observed

範例:

from pybaseball.statcast_pitcher import statcast_pitcher_active_spin

# 獲得 2023 球季的有效旋轉數據
statcast_pitcher_active_spin(2023)

# 獲得 2023 球季的有效旋轉數據,限制最小投球數 1000
statcast_pitcher_active_spin(2023, minP=1000)

# 獲得 2023 球季的有效旋轉數據,計算方法改為 observed
statcast_pitcher_active_spin(2023, _type="observed")

一樣需要注意一下 import。

statcast_pitcher_spin_dir_comp

可以知道兩種不同球種的轉軸,以及有效旋轉率,還有轉軸差異。也能知道不同有效旋轉計算方法下所獲得的轉軸。如果是去頁面看的話還可以看到 Savant 的精美轉軸圖:

Statcast Spin Axis Fastball Comparison | baseballsavant.com (mlb.com)

  • year:查詢的球季,必填,需為整數。
  • pitch_a:第一種想拿來比較的球種,能用的代碼也跟 statcast_pitcher_pitch_movement 一樣可以參考 util.py 裡的設定,預設是 FF 四縫線。
  • pitch_b:想跟第一種球種比較的第二種球種,能用的代碼也跟 statcast_pitcher_pitch_movement 一樣可以參考 util.py 裡的設定,預設是 CH 變速。
  • minP:最小投球數,只看第一種球種的投球數,預設是 100。
  • pitcher_pov:布林值,如果是 True 會是投手視角的轉軸與位移方向,如果是 False 則是打者視角下的方向。

範例:

from pybaseball import statcast_pitcher_spin_dir_comp

# 獲得 2023 球季的轉軸相關比較數據
statcast_pitcher_spin_dir_comp(2023)

# 獲得 2023 球季的轉軸相關比較數據,比較四縫線與滑球
statcast_pitcher_spin_dir_comp(2023, pitch_a="FF", pitch_b="SL")

# 獲得 2023 球季的轉軸相關比較數據,改打者視角
statcast_pitcher_spin_dir_comp(2023, pitcher_pov=False)

本日小結

今天介紹 Statcast 投手相關的 methods,比打者多了滿多東西的,感謝大家耐心地看完。每個頁面其實都有 Savant 提供的小教學或解釋,如果要更深入他們也會附上相關連結,真的很佛心。如果想要更深入了解進階數據或分析,很推薦大家點進去看看。另外還有一個 statcast_pitcher_spin 還沒介紹,不過這個有熱心的人用 statcast_pitcher 去運算的 method,內容挺多的,有機會再跟大家詳細介紹。明天接下來會介紹 Statcast 裡的防守資料。

今天的程式碼:https://colab.research.google.com/drive/1nKsl84nw_4DEGxqN6jvt6OKgNVWXLNh3?usp=sharing


上一篇
Day 11 - Statcast 打擊篇
下一篇
Day 13 - Statcast 守備篇
系列文
Python 棒球數據分析套件 pybaseball 介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言